package com.qf.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @Aspect 标记该注解的类为切面类
 */
@Component
@Aspect
public class TestAop {
//    切入点表达式

    @Pointcut("execution(* com.qf.service..*.*(..))")
    public void testa(){
    }

//环绕增强中必须调用原始方法
//只有在环绕增强中才能获取 原始方法的返回值
//ProceedingJoinPoint: 此连接点对象只能在环绕增强中使用， 可以调用原始方法
    @Around("testa()")
    public Object around(ProceedingJoinPoint joinPoint){

        try {
            System.out.println("前置");
//            执行原始方法
            Object proceed = joinPoint.proceed();
            System.out.println("后置");
            return proceed;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("异常");
        }finally {
            System.out.println("最终");
        }
        return null;
    }

//    @Before("testa()")
//    public void before(JoinPoint joinPoint){
//        System.out.println("前置增强"+joinPoint);
//        System.out.println("类名"+joinPoint.getTarget().getClass());
//        System.out.println("方法名"+joinPoint.getSignature().getName());
//        System.out.println("参数"+ Arrays.toString(joinPoint.getArgs()));
//    }
//
//    @AfterReturning("testa()")
//    public void afterReturning(){
//        System.out.println("后置增强:有异常不执行");
//    }
//
//    @After("testa()")
//    public void after(){
//        System.out.println("后置增强：有无异常都执行");
//    }
//
//    @AfterThrowing(value = "testa()",throwing = "e")
//    public void afterthrow(Exception e){
//        System.out.println("异常增强"+e.getMessage());
//    }
}
